# 7.list 列表数据类型

# 列表类型 (list)

列表是Python的基础数据类型之一,其他编程语言也有类似的数据类型,比如JS中的数组, java中的数组等等

列表是用 [ ] 中括号来表达的,存储列表中的每个元素用 ' ' 单引号隔开,而且可以存放各种数据类型

lst = [1, '哈哈', "吼吼", [1,8,0,"百度"], ("我","叫", "元", "组"), "abc", {"我 叫":"dict字典"},{"我叫集合","集合"}]
print(lst)

执行结果:
[1, '哈哈', '吼吼', [1, 8, 0, '百度'], ('我', '叫', '元', '组'), 'abc', {'我 叫': 'dict字典'}, {'我叫集合', '集合'}]

列表相比于字符串,不仅可以存放不同的数据类型,而且可以存放大量的数据,

  1. 32位 python可以存放: 536870912个元素,
  2. 64位可以存放: 1152921504606846975个元素

而且列表是有序的(按照你保存的顺序),有索引, 可以切⽚片⽅方便便取值

# 索引

列表跟字符串一样也拥有索引

索引也称为下标,在python中索引也是下标是从0开始

反向索引:python中反向索引是从-1开始

反向索引:-0 等于 0,就是说你获取列表的-0的值,实际就是获取列表的开头值

so = ["江凡","江小凡","江凡凡","凡"]
print(so[3]
      
执行结果:
凡

​ 以上实例,通过索引获取列表中的第3位数据,从0开始算

so = ["江凡","江小凡","江凡凡","凡"]
print(so[-2])

执行结果:
江凡凡

​ 以上实例,通过反向索引获取列表中的反向第二位数据,从-1开始算

# 更改列表数据

列表数据是可以发生改变的

在字符串中就不可以使用这种方式来更改字符串内容

so = ["江凡","江小凡","江凡凡","凡"]
so[3] = "你好"
print(so[3])
print(so)

执行结果:
你好
['江凡', '江小凡', '江凡凡', '你好']

​ 以上实例,可以通过指定要修改的那块数据,进行重新赋值

# 切片

切片可以对列表进行截取取值,从0开始,反向切片从-1开始

反向切片,默认是从左向右切

特点:起始值可取,结束值不可取

格式:变量[起始位置 : 结束位置]

so = ["江凡","江小凡","江凡凡","凡"]
print(so[1:3])

执行结果:
['江小凡', '江凡凡']

​ 以上实例:通过获取,起始位置为:1 结束位置为:3的值

so = ["江凡","江小凡","江凡凡","凡"]
print(so[0:2] + so[1:3])

执行结果:
['江凡', '江小凡', '江小凡', '江凡凡']

​ 以上实例:能过 + 运算符,把两边的数据合并起来为一个列表

so = ["江凡","江小凡","江凡凡","凡"]
print(so[:2])

执行结果:
['江凡', '江小凡']

​ 以上实例,如果起始位置不填,默认从开头开始

so = ["江凡","江小凡","江凡凡","凡"]
print(so[2:])

执行结果:
['江凡凡', '凡']

​ 以上实例,如果结束位置不填,默认到结尾

so = ["江凡","江小凡","江凡凡","凡"]
print(so[:])

执行结果:
['江凡', '江小凡', '江凡凡', '凡']

​ 以上实例,如果起始跟结束位置都不填写,默认从头到尾执行

# 反向切片

反向切片,默认是从左向右切

特点:起始值可取,结束值不可取

格式:变量[起始位置 : 结束位置]

so = ["江凡","江小凡","江凡凡","凡"]
print(so[-3:-1])

执行结果:
['江小凡', '江凡凡']

# 步长

步长,可以在指定范围内,每几个取一个值

取值,取范围中的开头值

反向步长,以右向左方向取值

格式:变量[起始位置 : 结束位置 : 步长]

so = ["江凡","江小凡","江凡凡","凡"]
print(so[::2])

执行结果:
['江凡', '江凡凡']

​ 以上实例:每走二步,取一个值

so = ["江凡","江小凡","江凡凡","凡"]
print(so[::-2])

执行结果:
['凡', '江小凡']

​ 以上实例:反向步长,反向取值

# 列表的增删改查

# 增加

列表类型跟字符串类型是不一样的

  1. 字符串:是不可变的对象,所有任何操作对原字符串是不会有任何的影响
  2. 列表:是可以发生改变. 所以直接就在原来的对象上进行了操作

# 增加 - append()

给一个列表增加值,从结尾处增加,一次只能增加一个值

格式:列表变量.append("值")

so = ["麻花藤", "林林俊杰", "周润发", "周芷若"]
print(so)
so.append("你好")
print(so)

执行结果:
['麻花藤', '林林俊杰', '周润发', '周芷若']
['麻花藤', '林林俊杰', '周润发', '周芷若', '你好']
# 实例:录入员工信息

要求使用append()函数,实现模拟录入员工信息功能

user = []
while 1:
    user_so = input("请输入要录入的员工姓名,按 Q 键退出:")
    if user_so.upper() == "Q":
        break
    user.append(user_so)
    print(user)

# 指定位置增加 - insert()

指定位置中增加值,以0开始,0为开头位置

格式:列表变量.insert(位置,"值")

so = ["麻花藤", "林俊杰", "周润发", "周芷若"]
so.insert(1,"你好")
print(so)

执行结果:
['麻花藤', '你好', '林俊杰', '周润发', '周芷若']
so = ["麻花藤", "林俊杰", "周润发", "周芷若"]
so.insert(-1,"你好")
print(so)

执行结果:
['麻花藤', '林俊杰', '周润发', '你好', '周芷若']

​ 以上实例,反向增加

# 迭代添加 - extend()

增加多值到列表中,从结尾处增加

格式:列表变量.extend(["值","值"])

so = ["麻花藤", "林俊杰", "周润发", "周芷若"]
so.extend(["你好","世界"])
print(so)

执行结果:
['麻花藤', '林俊杰', '周润发', '周芷若', '你好', '世界']

# 删除

# 指定位置删除 - pop()

通过指定值的位置来进行删除,如果不填位置,默认删除最后一个

以 0 开始算,0 为开头位置

格式:列表变量.pop(位置值)

so = ["麻花藤", "林俊杰", "周润发", "周芷若"]
so.pop()
print(so)

执行结果:
['麻花藤', '林俊杰', '周润发']

​ 以上实例,不填写位置值,默认删除最后一个

so = ["麻花藤", "林俊杰", "周润发", "周芷若"]
so.pop(1)
print(so)

执行结果:
['麻花藤', '周润发', '周芷若']

​ 以上实例,删除位置为1 的值

# 获取删除的值- pop()

格式:变量 = 列表变量.pop(位置值)

so = ["麻花藤", "林俊杰", "周润发", "周芷若"]
soo = so.pop(1)
print("删除的值:",soo)
print(so)

执行结果:
删除的值: 林俊杰
['麻花藤', '周润发', '周芷若']

# 指定值删除 - remove()

指定值来进行删除,如果删除不存在的值会报错

格式:列表变量.remove(值)

so = ["麻花藤", "林俊杰", "周润发", "周芷若"]
so.remove("周润发")
print(so)

执行结果:
['麻花藤', '林俊杰', '周芷若']
# 实例:使用for循环清空列表

直接使用for循环是不可行的,因为for运行过程中会有一个指针来记录当前循环的元素是哪一个,如果使用for循环直接删除那么for循环一开始这个指针指向第0个,然后获取到第0个的元素,紧接着删除第0个,这个时候,原来排行为1的元素就会自动变成0,因为排行为0的元素已经消失了,然后for循环的指针在指定第1元素,这时原来的1已经变成0,也就是不会被删除了,所以直接使用for循环删除是不可行的。

注意:由于删除元素会导致元素的索引(位置) 发生改变,所以容易出现问题,尽量不要再循环中直接去删除元素,可以把要删除的元素添加到另一个列表中,然后在循环删除

so = [1,2,3,4,5,6,7,8,9]
for i in so:
    so.remove(i)
print(so)

执行结果:
[2, 4, 6, 8]

​ 以上实例,直接使用for循环删除全列表就会出现只能删除一半数据

# 实例:删除指定的元素

有一个列表:["周杰伦","周海媚","周星星","马云","周树人"],删除所有姓周的人

so = ["周杰伦","周海媚","周星星","马云","周树人"]
wo = []
for i in so:
    if i[0] == "周":
        wo.append(i)
for i in wo:
    so.remove(i)
print(so)

执行结果:
['马云']

解决方案1

so = [1,2,3,4,5,6,7,8,9]
wo = []
for i in so:
    wo.append(i)
for i in wo:
    so.remove(i)
print(so)

执行结果:
[]

​ 以上实例,使用二个for循环,先把要删除的值赋值到另一个列表中,在删除原来的值

解决方案2

so = ["周杰伦","周海媚","周星星","马云","周树人"]
for i in range(0,len(so)):
    so.pop()
print(so)

执行结果:
[]

# 清空列表 - clear()

清空列表的全部数据

格式:列表变量.clear()

so = ["麻花藤", "林俊杰", "周润发", "周芷若"]
so.clear()
print(so)

执行结果:
[]

# 切片删除 - del

指定范围内删除,以0开始,0为开头位置

特点:起始值可取,结束值不可取

格式:del 列表变量[起始位置 : 结束位置]

so = ["麻花藤", "林俊杰", "周润发", "周芷若"]
del so[1:3]
print(so)

执行结果:
['麻花藤', '周芷若']

# 修改

# 修改

按位置值进行修改

格式:列表变量[位置值] = "值"

so = ["麻花藤", "林俊杰", "周润发", "周芷若"]
so[3] = "你好"
print(so)

执行结果:
['麻花藤', '林俊杰', '周润发', '你好']

​ 以上实例:把3号值修改成你好

# 切片修改

按范围进行修改,以0开始,0为开头位置

特点:起始值可取,结束值不可取

格式:列表变量[起始位置 : 结束位置] = ["值","值"]

so = ["麻花藤", "林俊杰", "周润发", "周芷若"]
so[1:2] = ["你好","世界","世界"]
print(so)

执行结果:
['麻花藤', '你好', '世界', '世界', '周润发', '周芷若']

​ 以上实例,将第1号跟第2号值修改成 "你好","世界","世界" 这三个值

# 步长

步长,可以在指定范围内,每几个取一个值

取值,取范围中的开头值

格式:列表变量[起始位置 : 结束位置 : 步长] = ["值","值"]

so = ["麻花藤", "林俊杰", "周润发", "周芷若","码云"]
so[1:4:2] = ["你好","世界"]
print(so)

执行结果:
['麻花藤', '你好', '周润发', '世界', '码云']

​ 以上实例,切片修改也OK,如果步长不是1,要注意,元素的个数,如果切片没有步长或步长是1,则不用关心个数

# 查询

查询列表可以使用for循环查询,因列表是一个可迭代对象

so = ["麻花藤", "林俊杰", "周润发", "周芷若","码云"]
for io in so:
    print(io)

执行结果:
麻花藤
林俊杰
周润发
周芷若
码云

# 剩余常用操作

# 查询指定值出现的次数 - count()

查询指定的值在列表中出现的次数

格式:变量.count(值) 或 变量 = 变量.count(值)

so = ["码云","麻花藤", "林俊杰", "周润发", "周芷若","码云"]
print(so.count("码云"))

执行结果:
2

# 排序操作 - sort()

对列表中的所有值进行排序操作,默认是进行升序操作

如果列表中有字符串跟整数,就不能进行排序,不然会报错

格式:

  1. 列表变量.sort()

    so = [10,8,4,7,2,9,6,1,3]
    so.sort()
    print(so)
    
    执行结果:
    [1, 2, 3, 4, 6, 7, 8, 9, 10]
    

    ​ 以上实例,使用升序操作

  2. 列表变量.sort(reverse=True)

    so = [10,8,4,7,2,9,6,1,3]
    so.sort(reverse=True)
    print(so)
    
    执行结果:
    [10, 9, 8, 7, 6, 4, 3, 2, 1]
    

    ​ 以上实例,使用降序排序

# 反向查询 - reverse()

反向查询列表输出

格式:列表变量.reverse()

so = ["码云","麻花藤", "林俊杰", "周润发", "周芷若","码云"]
so.reverse()
print(so)

执行结果:
['码云', '周芷若', '周润发', '林俊杰', '麻花藤', '码云']

# 查询列表的长度 - len()

查询列表有几个值组成

格式:变量 = len(变量)

so = ["码云","麻花藤", "林俊杰", "周润发", "周芷若","码云"]
so = len(so)
print(so)

执行结果:
6

# 列表的嵌套

采用降维操作,建议从上看到下

so = [8, "码云", "msg", ["麻花藤", ["百事可乐"], "周润发"]]

# 找到msg

so = [8, "码云", "msg", ["麻花藤", ["百事可乐"], "周润发"]]
print(so[2])

执行结果:
msg

# 找到码云跟msg

so = [8, "码云", "msg", ["麻花藤", ["百事可乐"], "周润发"]]
print(so[1:3])

执行结果:
['码云', 'msg']

# 找到码云的码字

so = [8, "码云", "msg", ["麻花藤", ["百事可乐"], "周润发"]]
print(so[1][0])

执行结果:

# 将msg拿到,进行首字母大写,后在写回去

so = [8, "码云", "msg", ["麻花藤", ["百事可乐"], "周润发"]]
wo = so[2].capitalize()
so[2] = wo
print(so)

执行结果:
[8, '码云', 'Msg', ['麻花藤', ['百事可乐'], '周润发']]
so = [8, "码云", "msg", ["麻花藤", ["百事可乐"], "周润发"]]
so[2] = so[2].capitalize()
print(so)

执行结果:
[8, '码云', 'Msg', ['麻花藤', ['百事可乐'], '周润发']]

# 码云换成马云

so = [8, "码云", "msg", ["麻花藤", ["百事可乐"], "周润发"]]
so[1] = "马云"
print(so)

执行结果:
[8, '马云', 'msg', ['麻花藤', ['百事可乐'], '周润发']]
so = [8, "码云", "msg", ["麻花藤", ["百事可乐"], "周润发"]]
so[1] = so[1].replace("码","马")
print(so)

执行结果:
[8, '马云', 'msg', ['麻花藤', ['百事可乐'], '周润发']]

# 把麻花藤换成马化腾

so = [8, "码云", "msg", ["麻花藤", ["百事可乐"], "周润发"]]
so[3][0] = so[3][0].replace("麻花藤","马化腾")
print(so[3][0])

执行结果:
马化腾

​ 因为列表中还有小列表,如果有小列表在主列表中就会把小列表认为是一个值中

# 把百事可乐换成可口可乐

so = [8, "码云", "msg", ["麻花藤", ["百事可乐"], "周润发"]]
so[3][1][0] = so[3][1][0].replace("百事","可口")
print(so[3][1][0])
print(so)

执行结果:
可口可乐
[8, '码云', 'msg', ['麻花藤', ['可口可乐'], '周润发']]

# 在百事可乐后面加上可口可乐

so = [8, "码云", "msg", ["麻花藤", ["百事可乐"], "周润发"]]
so[3][1].append("可口可乐")
print(so)

执行结果:
[8, '码云', 'msg', ['麻花藤', ['百事可乐', '可口可乐'], '周润发']]